﻿using System;
using System.Data;
using SiGeCoPre.Presupuesto_BL;
using SiGeCoPre.Presupuesto_DAO;
using SiGeCoPre.Presupuesto_DTO;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Factory;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_BLIMPL
{
    /// <summary>
    /// Clase que implementa BLProvincias
    /// </summary>
    class BLIMPLProvincias:Presupuesto_BL.BLProvincias
    {
        DAOProvincias createProvincia = DAOFactoryPresupuesto.createProvincia();
        BLPaises createPais = BLFactoryPresupuesto.createPais();

        /// <summary>
        /// Guarda una provincia
        /// </summary>
        /// <param name="p">Objeto que tiene los datos de la provincia a guardar</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool saveProvincia(provinciasDTO p)
        {
            Boolean correcto = false;
            try
            {
                Boolean insertado = createProvincia.saveProvincia(p.Pais.ID, p.Nombre, p.Activo);

                if (insertado)
                {
                    correcto = true;
                }
               
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Modifica una provincia
        /// </summary>
        /// <param name="p">Objeto con los datos de la provincia a modificar</param>
        /// <param name="nombre">Determina la provincia a modificar</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool updateProvincia(provinciasDTO p, string nombre)
        {
            Boolean correcto = false;

            try
            {
                provincias pro = createProvincia.getProvincia(nombre);

                if (null != pro)
                {
                    Boolean modificado = createProvincia.updateProvincia(p.Pais.ID, p.Nombre, p.Activo, pro.ID);

                    if (modificado)
                    {
                        correcto = true;
                    }    
                }
                
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Eliminar una provincia
        /// </summary>
        /// <param name="nombre">Determina la provincia a eliminar</param>
        /// <returns>Devuelve true si fue eliminada correctamente o false si falló</returns>
        public bool deleteProvincia(string nombre)
        {
            Boolean correcto = false;

            try
            {
                Boolean eliminado = createProvincia.deleteProvincia(nombre);

                if (eliminado)
                {
                    correcto = true;
                }
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Lista todas las provincias
        /// </summary>
        /// <returns>Devuelve una tabla con todas las provincias</returns>
        public DataTable getAllProvincia()
        {
            DataTable listadoProvincias = null;

            try
            {
                DataTable provincias = createProvincia.getAllProvincia();

                if (null != provincias)
                {
                    listadoProvincias = provincias;
                }
                
            }
            catch (Exception ex)
            {

                listadoProvincias = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return listadoProvincias;
        }

        /// <summary>
        /// Obtiene una provincia
        /// </summary>
        /// <param name="nombre">Determina la provincia a obtener</param>
        /// <returns>Devuelve un objeto provincia</returns>
        public provinciasDTO getProvincia(string nombre)
        {
            provinciasDTO provincia = null;

            try
            {
                provincias pro = createProvincia.getProvincia(nombre);
                DataTable paises = createPais.getAllPais();
                DataTable provincias = createProvincia.getAllProvincia();
                if (null != pro)
                {
                    provincia = new provinciasDTO();
                    provincia.Activo = pro.Activo;
                    provincia.ID = pro.ID;
                    provincia.Nombre = pro.Nombre;
                    paisesDTO p = new paisesDTO();
                    p.Nombre = provincias.Select("Nombre = '" + nombre + "'")[0]["Nombre1"].ToString();
                    p.Activo = Convert.ToBoolean(paises.Select("Nombre = '" + p.Nombre + "'")[0]["Activo"].ToString());
                    p.ID = Convert.ToInt16(paises.Select("Nombre = '" + p.Nombre + "'")[0]["id"].ToString());
                    provincia.Pais = p;
                }
            }
            catch (Exception ex)
            {

                provincia = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }
            return provincia;
        }
    }
}
